
#ifndef _XP_MOTOR_STD_H
#define _XP_MOTOR_STD_H

#define XP_MOTOR_NAME_LENGTH (20)

// 电机旋转方向枚举
typedef enum
{
    motor_forward = 0,
    motor_reverser = 1,
} motor_direction_t;

typedef unsigned short motor_rpm_t;

struct xp_motor_stdops;
typedef struct xp_motor_stdops xp_motor_stdops_t;

struct xp_motor;
typedef struct xp_motor xp_motor_t;

typedef enum {
    motor_ok = 0,
    motor_err_ctrl = -1,
    motor_err_para = -2,
    motor_err_uninit = -3,
} motor_error_t;

/* 
    电机驱动抽象层接口定义，建议在调用相关接口时判断对应的函数指针是否为空
    具体实现根据电机自身的特性处理或忽略，当接口函数不需要处理，也应该为对应
    的函数指针赋予一个什么都不处理且返回值为成功或失败的函数
*/
struct xp_motor_stdops
{
    /* 电机初始化设置及配置，正常初始化将motor对象的inited属性置1 */
    int (*init)(xp_motor_t *motor);
    /* 设置电机motor的速度为rpm，rpm为每分钟旋转次数, 如果电机在运行过程中设置速度电机将相应改变运行速度 */
    int (*speed_set)(xp_motor_t *motor, motor_rpm_t rpm);
    /* 获取电机的转速，通过传入的参数返回，函数返回值应返回函数执行状态 */
    int (*speed_get)(xp_motor_t *motor, motor_rpm_t *rpm);
    /* 电机方向设置，分为正转与反转 */
    int (*direction_set)(xp_motor_t *motor, motor_direction_t dir);
    /* 获取电机的方向 */
    int (*direction_get)(xp_motor_t *motor, motor_direction_t *dir);
    /* 电机启动旋转，电机方向及速度需要调用上面对应接口进行设置，启动后需要由stop函数或emerg停止 */
    int (*rotation_start)(xp_motor_t *motor);
    /* 电机停止转动 */
    int (*rotation_stop)(xp_motor_t *motor);
    /* 紧急停止转动，视电机具体控制情况处理 */
    int (*emerg_enable)(xp_motor_t *motor);
    /* 紧急停止恢复 */
    int (*emerg_disable)(xp_motor_t *motor);
    /* 获取电机警告或错误码 */
    int (*error_get)(xp_motor_t *motor, motor_error_t *err_code);
    /* 清除电机的警告或错误 */
    int (*error_clear)(xp_motor_t *motor);
    /* 电机编码器数据读写，包含电机转动的圈数以及不足一圈的角度*/
    int (*encode_get)(xp_motor_t *motor, int *num_of_turn, int *sub_angle);
    /* 位置模式下，设置电机需要转动的圈数以及不足一圈的角度 */
    int (*position_set)(xp_motor_t *motor, int num_of_turn, int sub_angle);
};

struct xp_motor
{
    // 电机属性
    unsigned char name[XP_MOTOR_NAME_LENGTH + 1];
    // 初始化标识
    unsigned char inited;
    // 不同电机的私有属性,modbus设备为modbus设备类型
    void *private_data;
    // 电机的通用操作方法
    struct xp_motor_stdops *ops;
};

#endif
